﻿using Acaweb.Data.Contracts;
using Acaweb.Model.Entities;
using Acaweb.Model.Entities.DatosCompuestos;
using Acaweb.Componentes.Contracts;
using System.Collections.Generic;
using System.Linq;

namespace Acaweb.Componentes
{
    public class CursosService : BaseService, ICursosService
    {
        private ICursosDao _CursosDao;
        private ICursosMatriculadosDao _CursosMatriculadosDao;
        private IHorariosCursosDao _HorariosCursosDao;
        private IPrematriculasDao _PrematriculasDao;

        public IPrematriculasDao PrematriculasDao
        {
            get { return _PrematriculasDao; }
            set { _PrematriculasDao = value; }
        }

        public ICursosMatriculadosDao CursosMatriculadosDao
        {
            get { return _CursosMatriculadosDao; }
            set { _CursosMatriculadosDao = value; }
        }

        public ICursosDao CursosDao
        {
            get { return _CursosDao; }
            set { _CursosDao = value; }
        }

        public IHorariosCursosDao HorariosCursosDao
        {
            get { return _HorariosCursosDao; }
            set { _HorariosCursosDao = value; }
        }

        public IList<Cursos> GetAll()
        {
            return CursosDao.GetAll();
        }

        public Cursos GetById(CursoPk Id)
        {
            return DeepLoad(CursosDao.GetById(Id));
        }

        public IList<Cursos> GetByPlaneEstudio(int PlanEstudio)
        {
            return CursosDao.GetByPlaneEstudio(PlanEstudio).ToList();
        }

        public IList<Cursos> GetByMateria(int Materia)
        {
            return CursosDao.GetByMateria(Materia).ToList();
        }

        public IList<Cursos> CargarPrematricula(int CodigoEstudiante, PeriodoAcademico PeriodoAcademico)
        {
            List<Prematriculas> Prematriculas = PrematriculasDao.GetByCodigoEstudiante(CodigoEstudiante).ToList();
            List<Cursos> PrematriculaCursos = new List<Cursos>();

            Prematriculas.ForEach(
                t => PrematriculaCursos.Add(CursosDao.GetByMateria(t.PrematriculaPk.CodigoMateria, PeriodoAcademico
                    ).SingleOrDefault(r => r.CursoPk.Grupo == t.PrematriculaPk.Grupo)));

            PrematriculaCursos = PrematriculaCursos.FindAll(t => t != null);

            return PrematriculaCursos;
        }

        public IList<Cursos> GetByPeriodoAcademico(PeriodoAcademico PeriodoAcademico)
        {
            return CursosDao.GetByPeriodoAcademico(PeriodoAcademico).ToList();
        }

        public IList<Cursos> GetByEstudianteAndPeriodoAcademico(int CodigoEstudiante, PeriodoAcademico PeriodoAcademico)
        {
            List<CursosMatriculados> Lista = CursosMatriculadosDao.GetByEstudiante(CodigoEstudiante, PeriodoAcademico).ToList();
            IList<Model.Entities.Cursos> ListaCurso = new List<Model.Entities.Cursos>();

            Lista.ForEach(t => ListaCurso.Add(t.Curso));

            return DeepLoad(ListaCurso.ToList());
        }

        private Cursos DeepLoad(Cursos Curso)
        {
            Curso.ListaHorariosCursos = HorariosCursosDao.GetByCurso(Curso.CursoPk);
            return Curso;
        }

        private IList<Cursos> DeepLoad(List<Cursos> Lista)
        {
            Lista.ForEach(t => t.ListaHorariosCursos = HorariosCursosDao.GetByCurso(t.CursoPk));
            return Lista;
        }


        public IList<Cursos> GetByPeriodoAcademico(int PlanEstudio, PeriodoAcademico PeriodoAcademico)
        {
            IList<Cursos> Lista = CursosDao.GetByPeriodoAcademico(PeriodoAcademico, PlanEstudio);
            return DeepLoad(Lista.ToList());
        }


        public IList<Cursos> GetByDocenteAndPeridoAcademico(string Docente)
        {
            List<HorariosCursos> Lista = HorariosCursosDao.GetByDocenteAndPeriodoAcademico(Docente, new PeriodoAcademico { Ano = 2010, Periodo = 2 }).ToList();

            List<Cursos> ListaCursos = new List<Cursos>();

            foreach (HorariosCursos Horario in Lista)
            {

                CursoPk miCursoPk = Horario.HorarioCursoPk.CursoPk;
                if (ListaCursos.FindAll(t => t.CursoPk.CodigoPlan == miCursoPk.CodigoPlan && t.CursoPk.CodigoMateria == miCursoPk.CodigoMateria && t.CursoPk.Grupo == miCursoPk.Grupo && t.CursoPk.Semestre == miCursoPk.Semestre).Count == 0)
                {
                    ListaCursos.Add(CursosDao.GetById(Horario.HorarioCursoPk.CursoPk));
                }
            }

            return ListaCursos;
        }


        public IList<Cursos> GetByMateria(int Materia, PeriodoAcademico PeriodoAcademico)
        {
            List<Cursos> Lista = CursosDao.GetByMateria(Materia, PeriodoAcademico).ToList();
            return DeepLoad(Lista);
        }
    }
}